<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            面向对象
                --是编程思想
               
                js是面向对象编程语言，js中的万物皆对象

                但是js目前的发展趋势 是面向过程编程思想---函数式编程

                    js内置的很多东西都是 采用面向对象的思想写的
                    但是框架目前 使用框架写项目-基本都是面向过程-函数式编程
                    （最早的框架  react1x 以前 采用面向对象的思想，后来改成面向过程--函数式编程）
        

                    什么要面向对象的思想--js内置的很多东西都是 采用面向对象的思想写的（有些第三库库也是）
    
                 
                    
                    面向对象- 找到一个对象，来帮助我完成。

                    面向过程- 自己关注过程-一步一步代码写完


                    面向对象中是包含面向过程的

                    面向对象--三大特点--1--封装--（本质就是把面向过程的代码给封装了）
                                        ---封装成对象的 属性（面向过程中定义的变量）
                                            和方法（面向过程中一个一个功能写成函数 ）
                                     --2-继承
                                     --3-多态    
                                     
                    写面向对象的核心 在于 提取---面向过程中的 变量   和 一个一个 函数
                                            变量-》对象的属性 
                                            函数-》对象的方法                
        
     */

        /*
           js 内置的 
   
              arr是一个具体的对象 ------------刘健
              Array 是一个构造函数--一类东西---人类---构造函数在传统的面向对象语言中叫类
                   实际生活 人类 是一个抽象的概念,编程中类（构造函数）都是我们自己定义的
              类（构造函数）和对象的关系----     类是对象的模板（）--- 每一个对象都是根据类的特点去创建的,类的内部（构造函数）定义的所有一类对象的属性和方法
   
                   
   
               let arr = new Array()   -- []
               arr,length
               arr.push
               let arr2 = new Array()
               arr2.length arr2.push
   
               let d1 = new Date()
               let d2 = new Date()
               d1.getFullYear 
               d2.getFullYear
   
        
        */

        /* 

        1-面向对象的写法
            定义一个构造函数-- 使用构造函数 创建对象

            狗类--狗的构造函数---
            使用狗类创建 一条 一条的狗

       2-  Math 对象 全局变量     使用字面量{}  或者 new Object()   
        
        */
        /*          
            定义一个构造函数
            1-首字母大写
            2-调用构造函数的时候需要加new 才能创建对象（否则就是一个普通函数）
            3- 构造函数内部可以使用一个关键字 this 是内部，自动定义的变量 var  this = {}  空对象（没有属性和方法）
            4- 构造函数会自动返回this 
            5- 自己给this 添加属性和方法

            构造函数内部 两个地方都可以使用this
                1- 直接在构造函数内 使用this  ，指的是 调用构造函数时候创建的 那个对象
                2- 对象的方法内部，使用this ，指的  谁调用这个方法 ，这个方法内部的this 就是谁
        */
        function Dog(name, age, color) {
            // var this = {}
            console.log(this);
            // 属性---要根据功能和需求 自己设计
            this.name = name;
            this['age'] = age;
            this.color = color;
            this.children = [];
            // 方法------要根据功能和需求 自己设计

            this.run = function (distance) {
                console.log('我是 ' + this.name + ',我在跑' + distance + '米');
                console.log(this);
                return 'aa'
            }


            // return this 
        }
        let d1 = new Dog('小黑', 1, '黑色');
        console.log(d1);
        d1.run(100)
        let d2 = new Dog('小白', 2, '黄色');
        d2.run(10)

        console.log(d1.name);
        console.log(d2.name);
        // d1.name
        // d1.age
        // d1.color


        /* 
         2-字面量创建对象
        */
        let MyMath = {
            PI: 3.1415926,
            max(arr) {
                var max = arr[0];
                for (let i = 1; i < arr.length; i++) {
                    if (arr[i] > max) {
                        max = arr[i]
                    }
                }
                return max;
            },
            min() { }
        }

        let arr4 = [1, 2, 3, 4];
        let r1 = MyMath.max(arr4)
        console.log(r1);




    </script>

</body>

</html>